home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / pascal / keymakr.exe / KEYMAKER.DOC < prev    next >
Encoding:
Text File  |  1990-10-07  |  35.3 KB  |  1,094 lines

  1.  
  2.  
  3.                            KeyMaker V2.0
  4.                            Copyright 1990
  5.  
  6.                            Carl A. Franz - BabySitter
  7.                            JFL Consulting
  8.                            1115 S. RidgeLand
  9.                            Oak Park,  Il 60304
  10.                            (708) 383-1546
  11.                            CServe - 71041,1512
  12.  
  13.  
  14.      Purpose:  The routines presented here facilitate the creation
  15. of a
  16. hash-keys for both names and addresses.  The keys created are
  17. 'rational'
  18. and, using phonetic keymaking technology (Soundex), are tolerance
  19. of mis-
  20. spelling.  This will allow you to create table or B-Tree keys in
  21. Turbo
  22. Pascal applications which are tolerant of your users.
  23.  
  24. There are 3 general routines given here:
  25.  
  26.                 1) Whole Name 'key' generation.
  27.                 2) Whole Address 'key' generation.
  28.                 3) Single word 'Soundex' generation.
  29.  
  30.      This package comes with several files.  To wit:
  31.  
  32.  
  33.            KEYTOOLS.TPU - routines common to both the address
  34.                           and name 'keymaker' routines
  35.  
  36.            ADDRKEY.TPU  - the address key build routine
  37.            ADDRKEYL.PAS - the BUZZ word literal tables (appendix
  38. B)
  39.  
  40.            NAMEKEY.TPU  - the name key build routine
  41.            NAMEKEYL.PAS - the BUZZ word literal tables (appendix
  42. A)
  43.  
  44.            TESTAD.EXE   - test program for AddrToKey
  45.            TESTAD.PAS   - source for TESTAD.EXE
  46.            TESTKN.EXE   - test program for NameToKey
  47.            TESTKN.PAS   - source for TESTKN.PAS
  48.  
  49.  
  50.      Source for the TPU's come with registration.  Be forewarned,
  51. the source
  52. is a mess but it works well.  Registration will be explained on the
  53. last
  54. page of this document.  (It's the same old thing).
  55.  
  56.     The phonetic keying system I use for individual words is called
  57. Soundex.  It was, I believe, developed by AT&T Bell Labs.  The
  58. concept and
  59. execution of the NameToKey and AddrToKey routines is proprietary
  60. to Carl A.
  61. Franz and JFL Consulting.
  62.  
  63.      TESTKN (for testing name key) and TESTAD (for testing address
  64. key)
  65. allow you to experiment with the KEYMAKER routines and learn how
  66. they work.
  67. I highly suggest you play with them before implementing KEYMAKER
  68. in your
  69. applications.  Unfortunately, the only way to recompile the test
  70. routines
  71. is if you own the TTT toolbox for on screen field editing (etc.). 
  72.  The TTT
  73. Toolbox can, I believe, be found as Shareware on the Compuserve
  74. BPROGA
  75. forum Library 2.  You can, however, rip out the formatted screen
  76. editing
  77. code and replace it with ReadLn's and then recompile when testing
  78. modifications to the BUZZ word tables.  The programs contain
  79. comments on
  80. how to do this.
  81.  
  82.  
  83.  
  84.                                 History
  85.  
  86.      Most brilliant ideas come to you in the middle of the night
  87. when you
  88. least expect it.  Not this one.  This one was born of sheer
  89. necessity.  I
  90. have two major character flaws: 1) I cannot remember anyone's
  91. birthdate or
  92. anniversary, and 2) I cannot spell worth a darn (this includes
  93. names). Thus
  94. I decided to let my computer remember for me (that is why God
  95. invented
  96. computers, isn't it?).  In doing the analysis for the project I
  97. looked into
  98. varying methods of producing this filing system.  Among the things
  99. neither
  100. prewritten applications nor Database packages do is phonetic key
  101. generation, auto-dialing of phone numbers, and/or decent mailing
  102. labels
  103. (for the most part).  Certainly, not all within one package, and
  104. none at
  105. all with phonetic key generation and/or lookup... so I decided to
  106. write one.
  107.  
  108.      By the way, the filing system project is still not finished
  109. but this
  110. is the third utility package to be developed from it.  Does anyone
  111. need a
  112. text screen or Pascal record compressor?
  113.  
  114.  
  115.  
  116.                              Disclaimer
  117.  
  118.      This package is distributed on an AS-IS basis.  No claim or
  119. warranty
  120. is implied as to it's fitness or suitability for any given
  121. application.  I,
  122. as far as I know, made every effort to make sure the package works
  123. as
  124. advertised.  As we all know, programming is an inexact science and
  125. bugs
  126. creep into programs from time to time.  I will make every
  127. reasonable effort
  128. to fix any bugs (in my routines only) reported as quickly as
  129. possible and
  130. replace the defective product free of charge - as long as you are
  131. a
  132. registered user (or I like you [read 'polite']).
  133.  
  134.      If you run into any problems with this product, please report
  135. them to
  136. me with as much documentation as possible.  You may report bugs via
  137. mail,
  138. phone (during reasonable evening and weekend CST hours), or
  139. Compuserve.
  140. The necessary information is on the first page of this document.
  141.  
  142.      Thank you for your support.
  143.  
  144.  
  145.  
  146.                               Apologia
  147.  
  148.  
  149.      Lord knows I did my best to document this.  It may have even
  150. been
  151. overkill.  I don't know.  If, however, you still have a question
  152. of the
  153. usage or whatever, please contact me.  I am proud of this effort. 
  154. I think
  155. it words extremely well.  I want people to use it (and more
  156. importantly to
  157. pay me for using it) so I'm fairly flexible in my support.
  158.  
  159.  
  160.  
  161.  
  162.  
  163.                          NAMEKEY  - NameToKey
  164.  
  165.  
  166.      The purpose of this routine is to create a 10 character
  167. database
  168. lookup-key from a TP STRING which contains a name.  None of this
  169. 3 or 5
  170. field crap for each element of the name (first, last, middle
  171. initial,
  172. honorific, and title).  Just type in the name as you would like to
  173. see it
  174. on an envelope, feed it into NameToKey and out comes a proper,
  175. rational key
  176. for table or data-base searches.  Since the key returned is a 10
  177. byte
  178. Pascal STRING, you can easily use it in MOST known TP database
  179. packages.
  180.  
  181.         Usage:
  182.  
  183.         VAR Name    : STRING[40]; {or however long your name string
  184. is}
  185.             NameKey : STRING[10];
  186.  
  187.         FUNCTION NameToKey(Name : String) : String;
  188.  
  189.         {$V-}  {Turn off strict string-checking}
  190.         NameKey := NameToKey(Name);
  191.  
  192.      The key created from a name consists of three parts:
  193.  
  194.                         LLLLLFFFFM
  195.  
  196. where 'LLLLL' is the Soundex made from the last name, 'FFFFF' from
  197. the
  198. first name, and 'M' the middle initial (if any).  For example, my
  199. name 'Mr.
  200. Carl A. Franz Esq.' will return a key of '1652 264 A'.  '1652 ' is
  201. a
  202. Soundex of my last name (FRANZ), '264 ' is a Soundex of my first
  203. name, and
  204. of course 'A' is my middle initial.  If only 1 word is found in the
  205. Name
  206. string it is assumed to be the last name and a key is generated
  207. accordingly.
  208.  
  209.     If your database tool box allows you to do CONTAINS or
  210. SUBSTRING key
  211. lookups you can use partial keys to for your searches.  For
  212. instance, a
  213. name of 'FRANZ' will product a key of '1652      ' which can then
  214. be used
  215. to search for all FRANZ's.  It will also find 'FRENZ' and several
  216. others I
  217. didn't think of.  You must, of course, shorten the length of the
  218. KEY string
  219. to the last significant digit of the key (in this case 4 -
  220. NameKey[0] :=
  221. ORD(4); or '1652') before doing a SUBSTRING or CONTAINS type
  222. database key
  223. search.  You could also do 'Soundx('FRANZ',5)' which would also
  224. return
  225. '1652 ' (see the section on KEYTOOLS).
  226.  
  227.     As you can see, doing wider name searches can be accomplished
  228. simply by
  229. removing characters from the end of the key.  This is in fact what
  230. I allow
  231. my users to do in my filing database system.  When the user enters
  232. a name,
  233. I create a key from it and do a search and display a list of names
  234. which
  235. match the key.  If the user cannot find the name they are looking
  236. for in
  237. the list they can hit the 'W' key and I lop off 4 characters of the
  238. key and
  239. try again.  If they press 'W' again, I lop off three more
  240. characters.  If
  241. they still cannot find the name I request that they try another
  242. spelling
  243. (sometimes Soundex doesn't work), or try another name because that
  244. one just
  245. isn't in the database.
  246.  
  247.  
  248.                         The NameKey Process
  249.  
  250.      The name key parsing routine goes through 6 steps to create
  251. a key:
  252.  
  253.        1) Remove all punctuation.
  254.  
  255.        2) Remove everything after '|' (explained later).
  256.  
  257.        3) Remove all names Buzz words (see appendix B) from the
  258.           name strings.
  259.  
  260.        4) Use the last word remaining after step 3 as the last
  261. name.
  262.  
  263.        5) Use the first word remaining after step 3 for the first
  264. name.
  265.  
  266.        6) The second word first character is the middle initial.
  267.  
  268.  
  269.        Example: 'Mr. Carl A. Franz Esq. DDS'   (original name
  270. field)
  271.  
  272.         Step 1: 'Mr Carl A Franz Esq DDS'      (remove punctuation)
  273.  
  274.         Step 2: 'Carl A Franz'                 (remove BUZZ words)
  275.  
  276.         Step 3: '264  A 1652'                  (Soundex remaining
  277. words)
  278.  
  279.         Step 4: Returns '1652 264 A'           (Create key string)
  280.  
  281.     If you use part of the name field for notes (which I tend to
  282. do) such
  283. as 'Douglas Jandara   | friend'  the parsing routine of the
  284. NameToKey will
  285. ignore everything after the '|'.  You, of course, do not need to
  286. use this
  287. feature if you don't want or need it.
  288.  
  289.     The next generation of this routine will contain everything
  290. necessary
  291. to parse and key company names ('Borland International Corp' for
  292. instance).
  293. If you think about corporate or business names as opposed to an
  294. individual
  295. names you will see just how complicated a task this will be.  For
  296. one thing,
  297. for companies one tends to remember to first word of the name not
  298. the last
  299. as with individuals.  Second, the list and variation of buzz words
  300. could
  301. be quite large.  And thirdly, while is the case of 'BORLAND
  302. INTERNATIONAL
  303. CORP' you would remember 'BORLAND', in the case of 'ARTHUR ANDERSON
  304. CORP'
  305. you would remember the 'ANDERSON'.  I am still analyzing this
  306. process and
  307. have made some progress.  Registered users will have input to the
  308. process.
  309.  
  310.  
  311.  
  312.                         ADDRKEY - AddrToKey
  313.  
  314.  
  315.      Purpose:  This routine creates a 13 character STRING key from
  316. a
  317. structure which contains an address.  It works well but there are
  318. some
  319. rules which must be followed in order to make it work correctly. 
  320. Read
  321. this and the next section carefully!
  322.  
  323.         Usage:
  324.  
  325.         TYPE
  326.            AddrType = RECORD {standard address record description}
  327.               Addr1 : String[40];
  328.               Addr2 : String[40];
  329.               City  : String[15];
  330.               State : String[2];
  331.               Zip   : string[5];
  332.            END;
  333.  
  334.         VAR AddrKey : STRING[13]; {the key string}
  335.  
  336.             Address : AddrType;   {Structure declaration for
  337. AddrToKey}
  338.  
  339.             AddrS1,               {Individual field declaration for
  340. }
  341.             AddrS2  : STRING;     {      AddrToKeyNS.            
  342.   }
  343.             ZipCodeS : String[5];
  344.  
  345.         FUNCTION AddrToKey(AddrS1, AddrS2, ZipCodeS : String) :
  346. String;
  347.  
  348.         FUNCTION AddrToKeyT(Address : AddrType) : String;
  349.  
  350.  
  351.         AddrKey := AddrToKeyT(Address);
  352.  
  353.                         or:
  354.  
  355.         {$V-} {to turn off strict string checking}
  356.         AddrKey := AddrToKey(addr1, addr2, zip);
  357.  
  358.  
  359.  
  360.      The reason I created 2 functions is ease of use.  If you are
  361. already
  362. using, or are planning to use an address structure that is defined
  363. EXACTLY
  364. like ADDRTYPE (most I've seen do) then you may use the AddrToKeyT
  365. function.
  366. This will make your coding easier. If you have your own structure
  367. then you
  368. may pass the individual fields to the keymaker via AddrToKey.
  369.  
  370.      Anyway, both AddrToKey and AddrToKeyT accept address
  371. information from
  372. you and produce a 13 byte address key string.  The key produced is
  373. structured like this:
  374.  
  375.                             ZZZZZSSSSSNNA
  376.  
  377. where ZZZZZ is zip code, SSSSS is street name Soundexed, NN is an
  378. integer
  379. hash of the street number (or box number), and A is a hash of the
  380. apartment
  381. number (apartment number 25 is a 7 (I just add the digits
  382. together)).
  383.  
  384.  
  385.                         The AddrKey Process
  386.  
  387.  
  388.      The address parsing routine goes through 5 steps to create a
  389. key:
  390.  
  391.        1) Normalize the incoming address strings.  This involves
  392. 2 steps:
  393.  
  394.                 A: Get rid of 'Attention' or 'Care OF' lines.
  395.                 B: If the address has both a street address and
  396.                    a PO Box number use whichever comes first.
  397.                 C: Get rid of all punctuation.
  398.                 D: Put the Zip Code into the key.
  399.  
  400.        2) Remove all address Buzz words (see appendix B) from the
  401.           address strings.
  402.  
  403.        3) Find apartment words and number (or letter), remove them
  404. from the
  405.           address strings.
  406.  
  407.        4) If first of the words left is MOSTLY numeric, it is the
  408.           street number, unless this is a PO BOX then the word
  409. after
  410.           BOX is used as the street number.
  411.  
  412.        5) The next word will be used as the street name,  it will
  413. be
  414.           Sondexed and inserted into the key.  EXCEPT: if this is
  415. a PO BOX
  416.           then 'BOX' is the street name, or if the if the street
  417. name is a
  418.           number (as in 54ST or 31ST) and it will be inserted into
  419. the key
  420.           as is. (REMEMBER: 33RD street IS 33RD ST. NOT
  421. Thirty-Third St.)
  422.  
  423.      There are several examples of the address keymaker processing
  424. in
  425. Appendix C.  I'd put them here, but they would break up the flow
  426. of the
  427. narrative.
  428.  
  429.      One thing to be very careful of is that a Post Office Box can
  430. only be
  431. found if input as 'P.O. BOX' or 'PO BOX' and a number (or letter). 
  432. If you
  433. were to enter an address as 'BOX 6' or P O BOX rather than 'PO BOX
  434. 6' the
  435. resulting key will not be what you expect.  Try it using
  436. TESTAD.EXE.
  437.    
  438.      Unlike the NameToKey function, you will have to pay more
  439. attention to
  440. the BUZZ word literal tables in ADDRKEYL.PAS (see also Appendix B).
  441. For
  442. instance, unless you change the literal table, 'JCT' is the proper
  443. abbreviation for Junction, not 'JNCT' (see the 'Literal Tables'
  444. section for
  445. instructions on changing the literal tables).  Any application you
  446. write
  447. using these routines will have to have some explanation of the
  448. standard
  449. abbreviations and what they are.  (see also the 'Literal Tables'
  450. section)
  451.  
  452.  
  453.                            KeyTools Utilities
  454.  
  455.  
  456.      The procedure and functions in the KEYTOOLS.TPU were not
  457. really
  458. written to be used other than by NameToKey or AddrToKey.  They are
  459. really
  460. just a group of routines which are common to both functions.  They
  461. are,
  462. however, useful little devils.  So, what the heck, think of them
  463. as a
  464. bonus.
  465.  
  466.  
  467. FUNCTION Soundx(InWord : string; cnt : integer) : string;
  468.  
  469.      This function creates a Soundex type phonetic representation
  470. of a
  471. word.
  472.                 InWord - the word you want 'Soundexed'.
  473.                 Cnt    - max number of characters in the returned
  474.                          string.
  475.          Returns : a Soundex of InWord no longer than Cnt
  476. characters.
  477.  
  478.          
  479. FUNCTION InTable(VAR Fword;VAR Stable; tsize: integer) : Boolean;
  480.  
  481.      This functions does a binary search on any sorted table which
  482. contains, as elements, 8 character strings.
  483.                 Fword  - the word you wish to find.
  484.                 Stable - the table to be searched (for Fword)
  485.                 tsize  - the number of elements in the table
  486.          Returns : true if Fword is found in Stable - else false
  487.  
  488.  
  489. FUNCTION ExtWord(WordNum : byte; InStr : string) : string;
  490.  
  491.         This function extracts a word from a string.
  492.                 WordNum - the number of the word within the string
  493.                           to extract and return.
  494.                 InStr   - The string from which to extract the word
  495.          Returns : The word to be extracted or a null string if you
  496.                    ask for the 10th word and there are only 8.
  497.  
  498.  
  499. FUNCTION CntWord(InStr : string) : Integer;
  500.  
  501.         This function returns the number of space separated words
  502. in a
  503. string.
  504.                 InStr - the string.
  505.          Returns : an integer containing the number of words in
  506. InStr.
  507.  
  508.  
  509.       If these routines are of any help...Great.  If not, so what.
  510.  
  511.  
  512.                             Literal Tables
  513.  
  514.      This section may be a bit confusing at first.  You may want
  515. to read it
  516. several times before attempting to edit the BUZZ word tables in
  517. ADDRKEYL.PAS and NAMEKEYL.PAS.
  518.  
  519.  
  520.      A listing of the literal tables in ADDRKEYL.PAS and
  521. NAMEKEYL.PAS is
  522. found on the next several pages.  These tables contain words or
  523. abbreviations which are common to, or are found in conjunction
  524. with, either
  525. names or addresses (depending on table).  The keymaker uses these
  526. tables to
  527. either remove words which inhibit the creation of PROPER name or
  528. address
  529. keys OR mark items which are necessary to the key (like the
  530. Apartment table
  531. helps me find the apartment number).
  532.  
  533.      You are free to change these tables as you see fit.  In doing
  534. so you
  535. MUST remember a few things:
  536.  
  537.        1) All words must be completely in uppercase characters.
  538.  
  539.        2) They must be in sorted order (remember that in ASCII
  540. numbers come
  541.           before letters).
  542.  
  543.        3) Any table entry which you remove from these tables
  544. increases the
  545.           likelihood that a key will be incorrectly created.  For
  546. instance,
  547.           were you to remove 'CPA' from the Honorifics table and
  548. a key for
  549.           the name 'Carl A Franz CPA' were created, the key would
  550. use 'CPA'
  551.           for the last name, not 'FRANZ' because it would not
  552. recognize
  553.           'CPA' as a name BUZZ word and remove it.
  554.  
  555.        4) Most of the words in these BUZZ word tables are
  556. abbreviations for
  557.           common words within their domain (address or name).  You
  558. may want
  559.           to add the full word to the table for cases where you
  560. feel your
  561.           users (the users of your particular application) would
  562. possibly
  563.           use the full word rather than the abbreviation.
  564.     
  565.      While I feel these table is complete, a common reason for
  566. changing
  567. them is to add foreign language or regionally peculiar address or
  568. name
  569. words.
  570.  
  571.      If you feel that you MUST cut the BUZZ word tables down in
  572. order to
  573. conserve DATA SEGMENT space,  the first place I would consider is
  574. the
  575. plethora of military designations in the Titles table.  After that,
  576. I'd
  577. look in the Honorifics (I don't know of anyone who is a CLU --
  578. 'Certified
  579. Licensed Underwriter' -- but your users may!).
  580.  
  581.      The BUZZ word tables are as large as they are for
  582. COMPLETENESS.  90%
  583. of the analysis time spent in building this product was spent
  584. compiling these
  585. tables.  You may, as you see fit, cut them down a bit, add to them,
  586. or
  587. leave them alone.  If you do decide to modify them... BE CAREFUL!
  588.  
  589.      I had considered writing a program which facilitates the
  590. maintenance
  591. of these tables.  Currently, however, I am working on the Company
  592. name side
  593. of the NameToKey function and don't have the time.  Oh well.
  594.  
  595.  
  596.                               Appendix A
  597.                          Name Type BUZZ Words
  598.  
  599.          Titles                                  Honorifics
  600.  
  601. Abbreviations     Meanings            Abbreviations    Meanings
  602.  
  603. '1ST'            First               'AL'            (as in Et.
  604. Al.)
  605. '2ND'            Second              'ASST'          Assistant
  606. 'ADMIRAL'        Admiral             'ATTY'          Attorney
  607. 'AG'             Adjutant General    'CEO'           Chairman of
  608. the Board
  609. 'AMB'            Ambassador          'CHAIRMAN'      Chairman
  610. 'AMN'            Airman              'CHAPLAIN'      Chaplain
  611. 'ATTY'           Attorney            'CLU'           Cert Licensed
  612. Underwriter
  613. 'BRIG'           Brigadeer           'CPA'          
  614. Certified-Public-Accountant
  615. 'CMDR'           Commander           'CPAS'          CPA plural
  616. 'CMSGT'          Chief Master Sgt    'DA'            District
  617. Attorney
  618. 'COL'            Colonel             'DD'            Dr of Divinity
  619. 'CPL'            Corporal            'DDS'           Dentist
  620. 'CPO'            Chief Petty Officer 'DMD'           Dental DR
  621. 'CPT'            Captain             'DR'            Doctor
  622. 'CWO'            Chief Warrant Off   'DVM'           Veterinary Dr
  623.                                      'ESQ'           Esquire
  624. 'DR'             Doctor              'ET'            (as in Et.
  625. Al.)
  626. 'DRS'            Doctors             'EXEC'          Executor
  627. 'ENS'            Ensign              'GOV'           Governor
  628. 'FR'             Friar               'II'            the Second
  629. 'GEN'            General             'III'           the Third
  630. 'GENERAL'        General             'IV'            the Fourth
  631. 'GOV'            Governor            'JP'            Justice o/t
  632. Peace
  633. 'GYSGT'          Gunnery Sgt         'JR'            Junior
  634. 'HON'            Honor/Honorable     'LLB'           Master Of Laws
  635. 'JDG'            Judge               'LLD'           Doctor Of Laws
  636. 'JG'             Junior Grade        'LT'            Lieutenant
  637. 'LCDR'           Lieutenant Cmmdr    'MD'            Medical Doctor
  638. 'LCPL'           Lance Corporal
  639. 'LT'             Lieutenant          'PERSONAL'      Personal
  640. 'M/SGT'          Master Sergeant     'PHD'           has a
  641. Doctorate
  642. 'MAJ'            Major               'PHYS'          Physician
  643. 'MCPO'           Master CPO          'PRES'          President
  644. 'MISS'           MISS                'RA'            Rear Admiral
  645. 'MOTHER'         Mother              'REP'           Representative
  646. 'MR'             Mister              'RET'           Retired
  647. 'MRS'            Misses              'RN'            Registered
  648. Nurse
  649. 'MS'             MS                  'RVN'           Reg. Vocat.
  650. Nurse
  651. 'MSGR'           Monsignor           'SR'            Senior
  652. 'PFC'            Private/First Class
  653.  
  654.                               Appendix A
  655.                          Name Type BUZZ Words
  656.  
  657.          Titles
  658.  
  659. abbreviations     Meanings
  660.  
  661. 'PROF'           Professor
  662. 'PSGT'           Platoon Sgt
  663. 'PVT'            Private
  664. 'RABBI'          Rabbi
  665. 'REP'            Representative
  666. 'REV'            Reverend
  667. 'REVEREND'       Reverend
  668. 'RT'             Retired
  669. 'S/SGT'          Staff Sergeant
  670. 'SA'             Seaman Apprentice
  671. 'SCPO'           Senior CPO
  672. 'SEN'            Senator
  673. 'SFC'            Sergeant First Class
  674. 'SGT'            Sergeant
  675. 'SISTER'         Sister
  676. 'SMN'            Seaman
  677. 'SMSGT'          Senior Master Sgt
  678. 'SR'             Senior
  679. 'SSM'            Staff Sgt. Major
  680. 'T/SGT'          Technical Sgt
  681. 'WO'             Warrant Officer
  682.  
  683.  
  684.                               Appendix B
  685.                         Address Type BUZZ Words
  686.  
  687. abbreviations       Meanings               abbreviations      
  688. Meanings
  689.  
  690. 'ALLEY'            Alley                  'MDWS'            
  691. Meadows
  692. 'ALY'              Alley                  'MNR'              Manor
  693. 'ANX'              Annex                  'MTN'             
  694. Mountain
  695. 'APTS'             Apartments             'N'                North
  696. 'ARC'              Arcade                 'NAS'              Navel
  697. Station
  698. 'AV'               Avenue                 'NE'               North
  699. East
  700. 'AVE'              Avenue                 'NW'               North
  701. West
  702. 'BCH'              Beach                  'OF'               Of
  703. 'BLDG'             Building               'ORCH'            
  704. Orchard
  705. 'BLVD'             Boulevard              'OVAL'             Oval
  706. 'BYU'              Bayou                  'PALMS'            Palms
  707. 'BOX'              BOX                    'PARK'             Park
  708. 'CIR'              Circle                 'PASS'             Pass
  709. 'CLG'              College                'PATH'             Path
  710. 'CMM'              Common                 'PK'               Park
  711. 'CMMS'             Commons                'PKWY'            
  712. Parkway
  713. 'CONDO'            Condominium            'PL'               Place
  714. 'COR'              Court                  'PLZ'              Plaza
  715. 'COURT'            Court                  'PO'               Post
  716. Office
  717. 'CP'               Camp                   'PRT'              Port
  718. 'CRES'             Crescent               'PT'               Point
  719. 'CT'               Court                  'RD'               Road
  720. 'CTL'              Central                'RDWY'            
  721. Roadway
  722. 'CTR'              Center                 'RR'               Rural
  723. Route
  724. 'CTS'              Courts                 'RT'               Route
  725. 'CYN'              Canyon                 'S'                South
  726. 'DR'               Drive                  'SCH'              School
  727. '1/2'              One Half               'SE'               South
  728. East
  729. 'E'                East                   'SHR'              Shore
  730. 'EST'              Estates                'SHRS'             Shores
  731. 'EXPWY'            Expressway             'SPDWY'           
  732. Speedway
  733. 'EXPY'             Expressway             'SPG'              Spring
  734. 'EXT'              Extension              'SPGS'            
  735. Springs
  736. 'FWY'              Freeway                'SQ'               Square
  737. 'GDNS'             Gardens                'ST'               Street
  738. 'GR'               Green                  'STA'             
  739. Station
  740. 'HBR'              Harbor                 'SW'               South
  741. West
  742. 'HL'               Hill                   'TER'             
  743. Terrace
  744. 'HLS'              Hills                  'TERR'            
  745. Territory/Terrace
  746. 'HOLW'             Hollow                 'TPKE'            
  747. Turnpike
  748. 'HOSP'             Hospital               'TR'               Trail
  749. 'HSE'              House                  'TUNL'             Tunnel
  750. 'HTS'              Heights                'TWN'             
  751. TownShip
  752. 'HWY'              Highway                'TWR'              Tower
  753. 'JCT'              Junction               'TWRS'             Towers
  754. 'LA'               Lane                   'US'               US
  755. 'LK'               Lake                   'VL'              
  756. Village
  757. 'LKS'              Lakes                  'VLG'             
  758. Village
  759. 'LN'               Lane                   'VLY'              Valley
  760. 'LNDG'             Landing                'W'                West
  761. 'LWR'              Lower                  'WAY'              Way
  762. 'MALL'             Mall                   'WTR'              Water
  763. 'MDL'              Middle                 'WY'               Way
  764.  
  765.                        Address Keymaker Examples
  766.  
  767.  
  768.      Each of these examples takes you through the steps the address
  769. keymaker
  770. goes through in order to create a key.  The first address in each
  771. example
  772. grouping is the user input, the rest follow the steps outlines in
  773. 'The
  774. AddrKey Process section.  A couple of things first:
  775.  
  776.         1) Because the street number is a TP Integer I will suggest
  777.            it's inclusion into the key with a '##'.
  778.  
  779.         2) The street name is Sondexed, that's why it shows up as
  780.            numbers.
  781.  
  782.  
  783.  Key State             Address Parsing                      
  784. Comments
  785. ZZZZZSSSSS##A
  786.                  Addr1: 'C/O: JFL Consulting           '    (User
  787. input)
  788. (cleared)        Addr1: '1115 S. Ridgeland Ave.  Apt #2'
  789.                  Zip:   '60304'
  790.  
  791.                  Addr1: ''                                 
  792. (normalize)
  793. 60304            Addr1: '1115 S Ridgeland Ave  Apt 2'
  794.  
  795.                  Addr1: ''                                  (buzz
  796. words)
  797. 60304            Addr1: '1115 Ridgeland  Apt #2'
  798.  
  799.                  Addr1: ''                                 
  800. (apartment words
  801. 60304       2    Addr1: '1115 Ridgeland'                        and
  802. number)
  803.  
  804.                  Addr1: ''                                  (Street
  805. number)
  806. 60304     ##2    Addr1: 'Ridgeland'
  807.  
  808.                  Addr1: ''                                  (Street
  809. name)
  810. 6030416536##2    Addr1: ''
  811.  
  812.  
  813.  
  814.  Key State             Address Parsing                      
  815. Comments
  816. ZZZZZSSSSS##A
  817.                  Addr1: 'P.O. Box 315                  '    (User
  818. Input)
  819. (cleared)        Addr1: '1115 S. Ridgeland Ave.  Apt #2'
  820.                  Zip:   '60304'
  821.  
  822.                  Addr1: 'PO Box 315                        
  823. (normalize)
  824. 60304            Addr1: ''
  825.  
  826. 60304            Addr1: 'BOX 315'                           (buzz
  827. words)
  828.                  Addr1: ''
  829.  
  830. 60304            Addr1: 'BOX 315'                          
  831. (apartment words
  832.                  Addr1: ''
  833.  
  834. 60304     ##     Addr1: 'BOX'                               (Street
  835. or Box
  836.                  Addr1: ''                                  
  837. number)
  838.  
  839. 60304BOX  ##     Addr1: ''                                  (Street
  840. name
  841.                  Addr1: ''                                   'BOX'
  842. in this
  843.                                                              case)
  844.  
  845.  
  846.                        Address Keymaker Examples
  847.  
  848.  
  849.  
  850.  Key State             Address Parsing                      
  851. Comments
  852. ZZZZZSSSSS##A
  853.                  Addr1: '1115 S. Ridgeland Ave.  Apt #2'    (User
  854. Input)
  855. (cleared)        Addr1: 'P.O. Box 315                  '
  856.                  Zip:   '60304'
  857.  
  858.                  Addr1: '1115 S Ridgeland Ave Apt 2'       
  859. (normalize)
  860. 60304            Addr1: ''
  861.  
  862.                  Addr1: '1115 Ridgeland Apt 2               (buzz
  863. words)
  864. 60304            Addr1: ''
  865.  
  866.                  Addr1: '1115 Ridgeland'                   
  867. (apartment words
  868. 60304       2    Addr1: ''
  869.  
  870.                  Addr1: 'Ridgeland'                         (Street
  871. or Box
  872. 60304     ##2    Addr1: ''                                  
  873. number)
  874.  
  875.                  Addr1: ''                                  (Street
  876. name)
  877. 6030416547##2    Addr1: ''
  878.                                                              case)
  879.  
  880.  
  881.  
  882.  Key State             Address Parsing                      
  883. Comments
  884. ZZZZZSSSSS##A
  885.                  Addr1: '128 W. 34th St.  Apt #2A      '    (User
  886. Input)
  887. (cleared)        Addr1: ''
  888.                  Zip:   '60304'
  889.  
  890.                  Addr1: '128 W 34th St Apt 2A          '   
  891. (Normalize)
  892. 60304            Addr1: ''
  893.  
  894.                  Addr1: '128 34th apt 2A               '    (buzz
  895. words)
  896. 60304            Addr1: ''
  897.  
  898.                  Addr1: '128 34th                      '   
  899. (apartment words
  900. 60304       3    Addr1: ''
  901.  
  902.                  Addr1: '34th                          '    (Street
  903. or Box
  904. 60304     ##2    Addr1: ''                                  
  905. number)
  906.  
  907.                  Addr1: ''                                  (Street
  908. name)
  909. 6030434TH ##2    Addr1: ''
  910.  
  911.  
  912.  
  913.                   JFL Consulting - Registration Mailer
  914.  
  915.  
  916.  
  917. Please supply us with the following information:
  918.  
  919. Your Name
  920. _________________________________________________________________
  921. ___
  922.  
  923. Street Address
  924. _______________________________________________________________
  925.  
  926. City, State and Zip Code
  927. _____________________________________________________
  928.  
  929. Country
  930. _________________________________________________________________
  931. _____
  932.  
  933. Voice Phone (_____) _____-_______ if in USA, otherwise
  934. ____-___-_____-________
  935.  
  936.  
  937.  
  938.  
  939.                                                             COST 
  940.      TOTAL
  941.   QTY       PRODUCT DESCRIPTION                             EACH 
  942.      PRICE
  943. -------   ---------------------------------------------   -------- 
  944.  ---------
  945. _______   _KeyMaker Registration ______________________   __10.00_ 
  946.  _________
  947. _______   _Keymaker Registration With Source___________   __18.00_ 
  948.  _________
  949. _______   _KeyMaker v3.0 Upgrade (when-available)______   ___5.00_ 
  950.  _________
  951. _______   _____________________________________________   ________ 
  952.  _________
  953. _______   _____________________________________________   ________ 
  954.  _________
  955. _______   _____________________________________________   ________ 
  956.  _________
  957.                                                                  
  958.    
  959.                                                            SUBTOTAL 
  960. _________
  961.  
  962.                                  (Illinois residents only) 7.0% TAX 
  963. _________
  964.                              
  965.                                                         GRAND TOTAL 
  966. _________
  967.  
  968.  
  969. Method of Payment:  [  ]-Check  [  ]-Money Order (no C.O.D.s
  970. please)
  971.  
  972.  
  973. Comments
  974. _________________________________________________________________
  975. ____
  976.  
  977. _________________________________________________________________
  978. _____________
  979.  
  980. _________________________________________________________________
  981. _____________
  982.  
  983. _________________________________________________________________
  984. _____________
  985.  
  986.  
  987.  Fold at the page break below with the printing facing out.  Then
  988. fold letter
  989.  style, exposing the mailing address and hiding your information.
  990. Staple your
  991.  check (if used) to the mailer, then staple or tape sides and top.
  992.  
  993. _________________________________                                
  994.   ┌───────┐
  995.                                                                  
  996.   │       │
  997. _________________________________                                
  998.   │ PLACE │
  999.                                                                  
  1000.   │ STAMP │
  1001. _________________________________                                
  1002.   │ HERE  │
  1003.                                                                  
  1004.   │       │
  1005. _________________________________                                
  1006.   └───────┘
  1007.  
  1008.  
  1009.  
  1010.  
  1011.                                          Carl A. Franz
  1012.                                          JFL Consulting
  1013.                                          1115 S. Ridgeland Ave.
  1014.                                          Oak Park, Il 60304
  1015.  
  1016.                                          Attn: Babysitter
  1017.  
  1018.  
  1019.  
  1020. _________________________________________________________________
  1021. _______________
  1022.  
  1023.  
  1024.  
  1025.  
  1026.  
  1027.  
  1028.  
  1029.  
  1030.  
  1031.  
  1032.  
  1033.  
  1034.  
  1035.  
  1036.  
  1037.  
  1038.  
  1039.  
  1040.  
  1041.  
  1042.  
  1043. _________________________________________________________________
  1044. _______________
  1045.  
  1046.  
  1047.  
  1048.          ----------------end-of-author's-documentation---------------
  1049.  
  1050.                          Software Library Information:
  1051.  
  1052.                     This disk copy provided as a service of
  1053.  
  1054.                            Public (software) Library
  1055.  
  1056.          We are not the authors of this program, nor are we associated
  1057.          with the author in any way other than as a distributor of the
  1058.          program in accordance with the author's terms of distribution.
  1059.  
  1060.          Please direct shareware payments and specific questions about
  1061.          this program to the author of the program, whose name appears
  1062.          elsewhere in  this documentation. If you have trouble getting
  1063.          in touch with the author,  we will do whatever we can to help
  1064.          you with your questions. All programs have been tested and do
  1065.          run.  To report problems,  please use the form that is in the
  1066.          file PROBLEM.DOC on many of our disks or in other written for-
  1067.          mat with screen printouts, if possible.  PsL cannot debug pro-
  1068.          programs over the telephone, though we can answer questions.
  1069.  
  1070.          Disks in the PsL are updated  monthly,  so if you did not get
  1071.          this disk directly from the PsL, you should be aware that the
  1072.          files in this set may no longer be the current versions. Also,
  1073.          if you got this disk from another vendor and are having prob-
  1074.          lems,  be aware that  some files may have become corrupted or
  1075.          lost by that vendor. Get a current, working disk from PsL.
  1076.  
  1077.          For a copy of the latest monthly software library newsletter
  1078.          and a list of the 2,000+ disks in the library, call or write
  1079.  
  1080.                            Public (software) Library
  1081.                                P.O.Box 35705 - F
  1082.                             Houston, TX 77235-5705
  1083.  
  1084.                                 1-800-2424-PSL
  1085.                              MC/Visa/AmEx/Discover
  1086.  
  1087.                           Outside of U.S. or in Texas
  1088.                           or for general information,
  1089.                               Call 1-713-524-6394
  1090.  
  1091.                           PsL also has an outstanding
  1092.                           catalog for the Macintosh.
  1093.  
  1094.